package tool.dialog;

import gui.DescribedCustomizedButton;
import gui.SecondaryMenu;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import tool.CustomizedButton;

/**rappresenta la classe che rappresenta la finestra di dialogo
 * per inserire i parametri base della mappa. La finestra
 * viene principalmente chiamata dal NewMapController per
 * l'inserimento dei parametri della nuova mappa
 * 
 * @author Koldar
 * @version 1.3
 */
public class InsertMapPropertiesDialog extends JDialog implements ActionListener{

	private static final long serialVersionUID = -5735260324001185721L;
	
	/**indica le dimensioni standard che il Dialog puo' assumere*/
	private static final Dimension DIALOGDIMENSION=new Dimension(500,200);
	/**rappresenta il Label che descrive cosa bisogna inserire nella {@link #mapWidth}*/
	private static final JLabel MAPWIDTHLABEL=new JLabel("Width of the map: ");
	/**rappresenta il Label che descrive cosa bisogna inserire nel {@link #mapHeight}*/
	private static final JLabel MAPHEIGHTLABEL=new JLabel("Height of the map: ");
	/**rappresenta il Label che descrive cosa bisogna inserire nel {@link #mapResolution}*/
	private static final JLabel MAPRESOLUTIONLABEL=new JLabel("Resolution of the map: ");
	/**rappresenta il Label che descrive cosa bisogna inserire nel {@link #mapTitle}*/
	private static final JLabel MAPTITLELABEL=new JLabel("Title of the map: ");
	// scritte sui pulsanti Ok e Cancel.
	private static final String TXT_OK = "Ok";
	private static final String TXT_CANCEL = "Cancel";
	
	/** Il layout utilizzato per disporre i vari componenti. */
	private GridBagLayout layout;
	/** I constraints associati al GridBagLayout. */
	private GridBagConstraints constraints;
	/**indica il pannello con le scrollBar che contiene tutti gli oggetti grafici del Dialog*/
	private JScrollPane scroll;
	/**rappresenta il pannello che contiene tutti gli oggetti grafici. Questo pannello e' poi inserito 
	 * in {@link #scroll} in modo da rendere il Dialog piu' user-friendly */
	private JPanel view;
	/**il TextField in cui l'utente puo' inserire la lunghezza della mappa*/
	private JRangedNumberField<Integer> mapWidth;
	/**il TextField in cui l'utente puo' inserire l'altezza della mappa*/
	private JRangedNumberField<Integer> mapHeight;
	/**il TextField in cui l'utente puo' inserire la risoluzione della mappa*/
	private JRangedNumberField<Integer> mapResolution;
	/**il TextField in cui l'utente puo' inserire il titolo della mapp*/
	private JStringField mapTitle;
	/**il pulsante di conferma del dialog*/
	private JButton ok;
	/**il pulsante di annulla del dialog*/
	private JButton cancel;
	/**indica se il Dialog ha raccolto le informazioni necessarie per la nuova mappa*/
	private boolean mapDataCollected;
	
	
	/**
	 * @return the mapDataCollected
	 */
	public boolean isMapDataCollected() {
		return mapDataCollected;
	}

	public InsertMapPropertiesDialog(Frame parent,String title){
		super(parent,title,true);
		
		layout = new GridBagLayout();
		constraints = new GridBagConstraints();
		this.setSize(DIALOGDIMENSION);
		this.setLayout(layout);
		
		this.mapDataCollected=false;
		
		this.view = new JPanel();
		view.setLayout(layout);
		
		this.scroll = new JScrollPane(this.view);
		
		this.addComponentToLayout(MAPTITLELABEL, 0, 0, 1);
		this.mapTitle = new JStringField();
		this.addComponentToLayout(mapTitle, 1, 0, 3);
		this.addComponentToLayout(MAPWIDTHLABEL, 0, 1, 1);
		this.mapWidth = new JRangedNumberField<Integer>(Integer.class,0,Integer.MAX_VALUE,false,false);
		this.addComponentToLayout(mapWidth, 1, 1, 3);
		this.addComponentToLayout(MAPHEIGHTLABEL, 0, 2, 1);
		this.mapHeight = new JRangedNumberField<Integer>(Integer.class,0,Integer.MAX_VALUE,false,false);
		this.addComponentToLayout(mapHeight, 1, 2, 3);
		this.addComponentToLayout(MAPRESOLUTIONLABEL, 0, 3, 1);
		this.mapResolution = new JRangedNumberField<Integer>(Integer.class,0,Integer.MAX_VALUE,false,false);
		this.addComponentToLayout(mapResolution, 1, 3, 3);
		this.ok = new CustomizedButton(InsertMapPropertiesDialog.TXT_OK,20,Color.WHITE,Color.BLUE,Color.WHITE,Color.BLUE,new Color(50,0,200),Color.GREEN,2,"Britannic Bold",Color.BLUE,Color.WHITE,Color.GREEN);
		this.addComponentToLayout(ok, 0, 4, 1);
		this.cancel = new CustomizedButton(InsertMapPropertiesDialog.TXT_CANCEL,20,Color.WHITE,Color.BLUE,Color.WHITE,Color.BLUE,new Color(50,0,200),Color.GREEN,2,"Britannic Bold",Color.BLUE,Color.WHITE,Color.GREEN);
		this.addComponentToLayout(cancel, 1, 4, 3);
		
		this.ok.addActionListener(this);
		this.cancel.addActionListener(this);

		this.add(scroll,constraints);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}

	/** Metodo che aggiunge i vari componenti di questa finestra rispettando il layout.
	 * @param c il componente da aggiungere.
	 * @param x il parametro gridx dei constraints.
	 * @param y il parametro gridy dei constraints.
	 * @param xweight il parametro weightx dei constraints. */
	private void addComponentToLayout(JComponent c, int x, int y, float xweight){
		constraints.gridx = x;
		constraints.gridy = y;
		constraints.weightx = xweight;
		constraints.weighty = 1;
		constraints.fill = GridBagConstraints.BOTH;
		view.add(c, constraints);
	}
	
	/**controlla ogni textfield per assicurarsi che al loro interno ci
	 * siano dei numeri (o comunque rispettino i domini esplicitati 
	 * dalle JLabel
	 * 
	 * @return TRUE se le TextField soddisfano i domini, FALSE altrimenti
	 */
	private boolean controlEveryTextField(){
		return ((this.mapTitle.getState()==JField.CORRECT)&&
				(this.mapWidth.getState()==JField.CORRECT)&&
				(this.mapHeight.getState()==JField.CORRECT)&&
				(this.mapResolution.getState()==JField.CORRECT));
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		if (arg0.getSource()==this.ok){//l'utente ha premuto OK
			if (this.controlEveryTextField()){
				this.mapDataCollected=true;
				this.dispose();
			}
		}
		if (arg0.getSource()==this.cancel){
			this.mapDataCollected=false;
			this.dispose();
		}
	}
	/**azzera il {@link #mapDataCollected}, in modo che il Dialog
	 * possa essere riutilizzato per una nuova raccolta dati
	 */
	public void resetDialog(){
		this.mapDataCollected=false;
	}

	/**
	 * @return the width
	 */
	public int getMapWidth() {
		return this.mapWidth.getValue();
	}

	/**
	 * @return the height
	 */
	public int getMapHeight() {
		return this.mapHeight.getValue();
	}

	/**
	 * @return the resolution
	 */
	public int getMapResolution() {
		return this.mapResolution.getValue();
	}

	/**
	 * @return the title
	 */
	public String getMapTitle() {
		return this.mapTitle.getValue();
	}
	
	
	
}
